/**
 * @file tiny_shell.h
 * @author Linquan 
 * @brief 
 * @version 0.1
 * @date 2025-04-03
 * 
 * @copyright Copyright (c) 2025
 * 
 */

#ifndef TINY_SHELL_H
#define TINY_SHELL_H

#include <stdint.h>

/* 定义 命令结构体中 执行函数类型 */
typedef int(*cmd_func_t)(int argc, char**argv);

/* log打印类型定义，最大支持32种类型 */
typedef enum
{
	RUN_PARA = 0,
    SET_PARA,	

	DB_TYPE_MAX
}log_print_type_t;

/* log 打印类型说明 */
#define LOG_TYPE_BRIF	\
				"\r\n\t\t*log type is below:\r\n"\
				"\t\t 0: RUN PARA \r\n"\
				"\t\t 1: SET PARA "

/**
	静态内联函数：检查 是否允许该类型打印
*/
extern uint32_t log_print_switch;
static inline int check_allow_log_print(log_print_type_t type)
{
    return (log_print_switch & (1 << type)) != 0;
}


/* 
    不使用 printf 函数进行打印输出，
    可以开启该宏开关，传入特殊的打印函数
*/
#define NOT_USE_printf_function 0

/* 用于使用命令行命令，打印对应类型的打印信息 */

#if NOT_USE_printf_function
#define LOG_INFO(print_func, type, format, ... )                	\
			do{                                     \
				   if(check_allow_log_print(type))		\
				   {									\
						print_func(format, ##__VA_ARGS__);  \
				   }			   						\
			 } while (0)    
#else
#define LOG_INFO( type, format, ... )                	\
			do{                                     \
				   if(check_allow_log_print(type))		\
				   {									\
						printf(format, ##__VA_ARGS__);  \
				   }			   						\
			 } while (0)    


#endif


/******************** API ******************************* */

/**
 * @brief 在串口接收中断使用
 *  将接受的一个数据送入 环形缓冲区
 */
void tiny_shell_save_data(char recv_data);


/**
 * @brief 在主循环中使用，解析缓冲区的数据，组成命令，并执行
 * 
 */
void tiny_shell_anayly(void);








#endif
